6. 比較方式 && 常用套件Utils


透過上一篇我們知道字串比較的差別
還有物件比較的這一個概念
那現在和大家說明一下一個例子後我再來介紹一些比較方式

String type;

for(Stiring item:List<String>items){

if(item=="1"){
type = "test";
...
    }

    }

type.length();

如果是剛踏入軟體工程師這個領域可能會發生以上兩個問題
1.我想信看過上一篇的大家應該知道item=="1" 一定是false
2.type.length() 開發編輯器(IDE)應該會提示有問題 因為你沒有初始化

然後如果照著提示行為 快速建立通常會幫你補上

String type = null;

...

type.length();

有時候我們不能太過相信電腦幫你判斷的
這樣執行可是會噴錯的 nullException
以上操作可以套用到許多不同型別中,例如:List,Set,Dto...

我們回歸到比較這一部分
字串比較如果使用原生的方法來講

boolean compareStr(String param){
    retruen "test".equals(param);
    }

// 不會寫 param.equals("test");

從我們一開始和大家說明物件初始化和物件為null這件事來講
這個方法參數為String型別但null也是可以當作參數的,因此有可能發生nullException

那我這邊提供給大家我比較常用的的一些「比較」方式
StringUtils.equalsIgnoreCase() 忽略大小寫比較
NumberUtils.compare() ==0 相等
BooleanUtils.compare() ==0 相等 or Boolean.True.equal() // Boolean.True.toString 會是"true"

列出一些我個人常用的方法
StringUtils.isBlank()
StringUtils.isNoneBlank()
StringUtils.split()
StringUtils.substring()
StringUtils.length()
StringUtils.EMPTY

ExceptionUtils.getRootCause() // 有時候錯誤訊息一直堆疊可以透過這個直接找根源

(JUC)
「執行序 - 延遲」
ThreadUtils.sleep(Duration.ofSeconds(1));
ThreadUtils.sleep(DurationUtils.toDuration(10, TimeUnit.SECONDS));

(jackson)
「精準度」
DecimalUtils.toBigDecimal() // 回傳 BigDecimal
DecimalUtils.toDecimal() // 回傳 String

ObjectUtils.allNotNull() // 這邊大家不要誤會是丟一個自定義型別 內多欄位的欄位是不是null
// 主要是每個丟進去讀是不是null ex: ObjectUtils.allNotNull("1","1",null) 這樣會false

Objects.nonNull() // 單獨判斷null

和Collection相關操作需要另外注入

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

Collections.emptyList(); 空List
CollectionUtils.size()
CollectionUtils.isEmpty()
CollectionUtils.isNotEmpty()

ListUtils.partition() // 根據總數 根據大小分批
SystemUtils.getEnvironmentVariable() // 取得系統參數

「亂數」
Random random = new SecureRandom();
int number = random.nextInt();
// 以上方式比 SecureRandom.getInstanceStrong() 來的更好因為此方式易造成Thread block

// 底層有 new Random()
number = RandomUtils.nextInt();

// 使用Thread 推薦使用
number = ThreadLocalRandom.current().nextInt();

「取得檔案路徑」
1.PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
File file = resolver.getResources("classpath:")[0].getFile(); // // path from resource, but startwith classpath: current file 讀取原檔案

2.file = FileUtil.getFromResource(""); // path from resource new file 會在暫存區建立檔案

3.file = ResourceUtils.getFile("classpath:"); // path from resource, but startwith classpath: current file 讀取原檔案

「列舉值」
EnumUtils.getEnum()
EnumUtils.getEnumMap(Enum.class) 取得所有的Enum資訊並以MAP回傳對應值

「序列化 -> byte[]」
Dto dto = new Dto()
dto.setName("test") // 假設有一欄位為name
OutputStream outputStream = new BufferedOutputStream(new ByteArrayOutputStream());
SerializationUtils.serialize(SerializationUtils.serialize(dto),outputStream);

「方法 反射」
MethodUtils.invokeMethod() // 透過這物件 呼叫類別/Bean 方法執行操作

ref:
https://hcdtc.github.io/zh/docs/30-development-manual/2-back-end/99-dev-utils/2-common-lang3/1-stringutils/

#java 17 #spring boot







你可能感興趣的文章

Function component vs Class component

Function component vs Class component

巢狀救星三部曲(3) Async Functions

巢狀救星三部曲(3) Async Functions

Linkedin Java 檢定題庫  try catch 流程

Linkedin Java 檢定題庫 try catch 流程






留言討論